/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.usuario.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.citas.entidad.ControlCita;
import com.nys.conci.citas.servicio.ServicioControlCitas;
import com.nys.conci.cliente.entidad.Pago;
import com.nys.conci.cliente.entidad.PlanPago;
import com.nys.conci.usuario.entidad.Especialidad;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

/**
 *
 * @author Yeudy10
 * @since 29/01/2013
 */
@ManagedBean
@ViewScoped
public class BeanRegistroEspecialidad extends BeanBase {

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioControlUsuario scu;
    @Inject
    private ServicioAdministracion sa;
    @Inject
    private ServicioControlCitas scc;
    private Especialidad especialidad;
    private Especialidad especialidad_select;
    private Especialidad especialidad_tabla;
    private List<Especialidad> lista_especialidad;
    private String numero;
    private String nombre;
    private String descripcion;
    boolean modificar;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanRegistroEspecialidad() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            setNombre("");
            setDescripcion("");
            setEspecialidad(new Especialidad());
            setEspecialidad_select(new Especialidad());
            setEspecialidad_tabla(new Especialidad());
            setLista_especialidad(new ArrayList<Especialidad>());
            setModificar(false);
            numero = "1";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        cargarEspecialidades();
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    public void cargarEspecialidades() {
        try {
            setLista_especialidad(new ArrayList<Especialidad>());
            lista_especialidad = sa.consultarListaEspecialidades();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void agregarEspecialidad() {
        try {
            if (validarCampos()) {
                if (modificar) {
                    especialidad_select.setDescripcion(getDescripcion());
                    especialidad_select.setNombre(getNombre());
                    sa.guardarEspecialidad(especialidad_select, modificar);
                } else {
                    setEspecialidad(new Especialidad());
                    getEspecialidad().setDescripcion(getDescripcion());
                    getEspecialidad().setNombre(getNombre());
                    sa.guardarEspecialidad(especialidad, modificar);
                }
                limpiar();
                modificar = false;
                cargarEspecialidades();
                numero = "1";
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void limpiar() {
        try {
            nombre = "";
            descripcion = "";
            especialidad = new Especialidad();
            setEspecialidad_select(new Especialidad());
            setEspecialidad_tabla(new Especialidad());
            modificar = false;
            numero = "0";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    private boolean validarCampos() {
        boolean resultado = true;
        if (getNombre() == null || getNombre().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nombre", mensaje);
            resultado = false;
        }
        if (getDescripcion() == null || getDescripcion().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Descripción");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_descripcion", mensaje);
            resultado = false;
        }
        if (getLista_especialidad() != null && nombre != null && !nombre.isEmpty()) {
            boolean va = false;
            for (Especialidad especi : getLista_especialidad()) {
                if (modificar && !especi.getId_especialidad().equals(especialidad_select.getId_especialidad()) && especi.getNombre().equals(nombre)) {
                    va = true;
                } else if (!modificar && especi.getNombre().equals(nombre)) {
                    va = true;
                }
            }
            if (va) {
                String mensaje = "No se permite ingresar especialidades con nombres iguales";
                MensajeUtil.agregarMensajeError(mensaje);
                resultado = false;
            }
        }
        return resultado;
    }

    public void modificarEspecialidad() {
        try {
            numero = "0";
            setEspecialidad_select(getEspecialidad_tabla());
            modificar = true;
            setDescripcion(getEspecialidad_select().getDescripcion());
            setNombre(getEspecialidad_select().getNombre());

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public void eliminarEspecialidad() {
        try {
            if (validarUsado()) {

                sa.eliminar(especialidad_select);
                limpiar();
                cargarEspecialidades();
                numero = "1";
                setDescripcion("");
                setNombre("");
                String mensaje = "Se eliminó la especialidad seleccionada";
                MensajeUtil.agregarMensajeInfo(mensaje);
            }


        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida en que parte esta siendo utilizada la especialidad
     *
     * @return true o false
     */
    private boolean validarUsado() {
        try {
            PlanPago pp = new PlanPago();
            pp = sa.consultarPlanPagoEspe(especialidad_select.getId_especialidad());
            if (pp != null) {
                String mensaje = "No se puede eliminar, la especialidad esta siendo utilizada en un plan de pago";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }

            List<ControlCita> cc = new ArrayList<ControlCita>();
            cc = scc.consultaListaCitasoEspecialidad(especialidad_select.getId_especialidad());
            if (cc != null || !cc.isEmpty()) {
                String mensaje = "No se puede eliminar, la especialidad esta siendo utilizada en cita";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }

            Pago p = new Pago();
            p = sa.consultarPagoCitaIdEspe(especialidad_select.getId_especialidad());
            if (p != null) {
                String mensaje = "No se puede eliminar, la especialidad esta siendo utilizada en un pago";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }

        return true;
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the especialidad
     */
    public Especialidad getEspecialidad() {
        return especialidad;
    }

    /**
     * @param especialidad the especialidad to set
     */
    public void setEspecialidad(Especialidad especialidad) {
        this.especialidad = especialidad;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the especialidad_select
     */
    public Especialidad getEspecialidad_select() {
        return especialidad_select;
    }

    /**
     * @param especialidad_select the especialidad_select to set
     */
    public void setEspecialidad_select(Especialidad especialidad_select) {
        this.especialidad_select = especialidad_select;
    }

    /**
     * @return the especialidad_tabla
     */
    public Especialidad getEspecialidad_tabla() {
        return especialidad_tabla;
    }

    /**
     * @param especialidad_tabla the especialidad_tabla to set
     */
    public void setEspecialidad_tabla(Especialidad especialidad_tabla) {
        this.especialidad_tabla = especialidad_tabla;
    }

    /**
     * @return the lista_especialidad
     */
    public List<Especialidad> getLista_especialidad() {
        return lista_especialidad;
    }

    /**
     * @param lista_especialidad the lista_especialidad to set
     */
    public void setLista_especialidad(List<Especialidad> lista_especialidad) {
        this.lista_especialidad = lista_especialidad;
    }
}
